{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 代码块1-载入模块"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "import matplotlib.pyplot as plt#绘图模块\n",
    "import numpy as np#矩阵模块\n",
    "import os\n",
    "import sys\n",
    "import tarfile#文件解压模块\n",
    "from IPython.display import display, Image\n",
    "from scipy import ndimage\n",
    "from sklearn.linear_model import LogisticRegression#回归模块\n",
    "from six.moves.urllib.request import urlretrieve#下载模块\n",
    "from six.moves import cPickle as pickle#压缩模块\n",
    "# Config the matplotlib backend as plotting inline in IPython\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 代码块2-下载文件\n",
    "\n",
    "注：由于该网络地址下载数据太慢，因此，建议不使用该函数进行数据下载。而是自己将数据下载到本地文件夹中。下载的网址如下：\n",
    "\n",
    "http://yaroslavvb.com/upload/notMNIST/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 代码块3-解压文件并存储解压后的文件地址\n",
    "\n",
    "由于该代码块的解压速度太慢，因此，利用解压工具解压该文件。并将解压后的文件夹地址存储起来，为后续的调用做好准备即可。下文代码删除了作业中解压部分的代码，而保留存储文件夹路径的代码。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true,
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "num_classes = 10\n",
    "np.random.seed(133)\n",
    "\n",
    "#创建每一个类别的文件夹名\n",
    "def maybe_extract(filename, force=False):\n",
    "  root = os.path.splitext(os.path.splitext(filename)[0])[0]  # remove .tar.gz\n",
    "  data_folders = [os.path.join(root, d) for d in sorted(os.listdir(root))\n",
    "    if os.path.isdir(os.path.join(root, d))]\n",
    "  if len(data_folders) != num_classes:\n",
    "    raise Exception(\n",
    "      'Expected %d folders, one per class. Found %d instead.' % (\n",
    "        num_classes, len(data_folders)))\n",
    "  return data_folders\n",
    "\n",
    "#本地存储notMnist数据的的文件夹\n",
    "train_filename = '/home/zlong/workspace/udacity/notMNIST/notMNIST_large'  \n",
    "test_filename = '/home/zlong/workspace/udacity/notMNIST/notMNIST_small'\n",
    "train_folders = maybe_extract(train_filename)\n",
    "test_folders = maybe_extract(test_filename)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题1-显示解压后的图像"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACTklEQVR4nD2Sy0tVYRTFf9/3He8t\nTU2THhAY9EAis6y4WooplJFyJcUgGjQIiqhBDWrUpD+hmlRE44iiSMUk0rzqtZeZRpEaFEVJT7DM\n1zme1eDe2tPFWnvttTb8H4/j8iVJCuWXYPHSiDMYKpl+b8D4axaNjVhn0pgBQ+YnncZhWDCqszhS\nTCPvXFHA4mXEN0dkgrxCGooy3BsALOsCSZKf3qlgToHO25Rolfu1Pv811zPycnKy84Zojxxx0+0p\nN9zUfUqlOA5LybQOcVUjmRaw88tL6aeZrwN4GVHiCyb6XS3JqRRxj/wdJHQZh4EOdVMTqBkPELv5\n0FdUTFZT7rzxl8ZIUOu+DqSvHNIlTvyLR6G2klAH1gMbbltLN2Nn5sIQgOjU89VlPMAAHqc0vpLs\niHPOOReJRiMclUqwALSpi3g4lxKdn9UB7urJQoyH0fJyWqgyv9osGH/nqt/tBcX0TXsBOA4q3MpL\nXcGCIakW9kp1OMBxRQNsmFETUS9CbFInuajPuRismV9cySD10S+D+EFILGuyhxo6J4zAsl2q5446\nUu5ua5jYlA7jgbXU8S1ZUEkXBkNBBZ1ULvzRQwgYErrFPqkUi6NRqqVDvRjAav0mHhFnaBRhqObd\n0yUx2rCAZVv2TKvdTHLSkwkyyxn+WZ9Ld/q3bugFMWk/DstG6RjX9CIzJZu/hXtU8/MhIYZd+O3R\nHTyb8gTQKNXTq9ZU621KUCE14AC4oJlXg390Cg9L4bi+Pf6o7yvSjbxVqFCzZTgcDQqkQHcwBuAv\n0Esary5Fx7MAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAABxklEQVR4nG2SMWiTURSFz733pQ1U\nUdK0SMBBrFSzqItYilAHQRAsIrg4OEkXwb3YRVAQoVAQBBE7uBRcHER0UHBSlAqCiBisCLUotFTU\nQMr/3j0O+aPN35z18L53+LhAd0TK088aNQh6xDBDchzWo1PZ8ye2eB4BALRA5bUBGEbBXtBjMXnk\ngx5Y0fCKkZFvdesgwxQXI53fh4v/QXVw9d1x0j0d2sI1zHFyW4seebZYGg7H11L+wBQ5UyjF9AVP\nAI+ZZVwolIYLfIIS5hgTF0OXQNWh5XgEfZhidP7c1TXXcIsLMJMJJjrHNnMVR7Pmfgiwt0mPvIjw\n362E2TD/qRz6Sus/QKIOoG0fsHRpbOPMaRDAMJQYRfoHld1r3BTnUj8kfyl+o7I+/UsICA9cAVCr\nfRHmS085r3cw1d9MzpP5XNHtDf9WDaUQQiiF/iWmjJcRoADUr47I7CqzGGPM0sZXEKi3j8Ewkfzz\ngEjHxn1miS8BKNR33BGZb1p+NqJrgGCkKqrmvLsv4TnapkXdHRAfrNOAnfcYE28PdcaGgx89MfJh\nBbi5zESSK+/PwQSVp41WbmLlEZrMSDKRkzDDOEknSWZ88xd4UO/LC7DSbwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACQ0lEQVR4nFWTW4iMcRjGf///9187\no12m3TbJlsipdWoWyRqHHeSQcy4okYt1uN5yJblxoVy7cCFla0k5N4RYu8ssIqylKKTkUJNZO2bN\nzDff42I+lufqrfd9n57efq+hoqozkwuWEZl9/TaolJZZRQX6q0CZepx1lWawtiq7tz+ozMpdndqZ\nsT4OwJRZxMD5Mc0qA6Y4qYHS4vpgKHRtzOg4h+WPOMvX2comC+u4SAvpYzUB6EhT/8GV7VwBwHFa\nb6KNP7UfD0P9N7VzWB/GVRZrX+gUbfo1jcio0RxQaR4DugCAx1JpF5d0FQyWTvUQ/6XdlbS0kr3W\nEOd1rME3xQmtvPa2Vw8+rFyDPqXYodJ/WbuxDmwwcxo3id3OeQI73DJh8H5J0Y4w6379aMaGLvaB\nTuKFHcokef908QkzGkB2ItsSpciTPQXjMKpbzk1Wz8l/AtB4r/C5drzrKTgfPLZKSdI6iwVLly6T\nkNbjYTEkefNo4lyuY40XzJjNXTbypZcAa/yaBM9ym6JDTwhkaKn72csKurJGYJkv7eScujEGw2m9\nYNZ3teHAGtaRux1bQhoro5ok90jEvvcSAJY7SrFGWoZnHCvLWs85pTGADabHSbOFdy8JBEn78XFk\nKSksYJkfK14jTk+myrogkuD511Xj6Aoh7NQrlkiFXD6fHx705ecKelWLAdzYBaSIdWdHOWGKTWOG\n+/xS9NaQVwbYLG0I74yjQzfA/CHbtVI4esiGsNsp9FHtoxD2t/+SLmkZI1/xG7MfImFU7DOTAAAA\nAElFTkSuQmCC\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACDklEQVR4nD2QX2iOYRjGf/fzvrPN\nZlqa4sDKGrONEjtQJJQsJ4ikJMriwNFOOHQiyZkDOZTakVJS1s4kDV9Kk32bNZsY5k/L12Z/vvd5\nnsvB937uk6er33N3XfdlgKmusD0kAMggmy99fT84tGIARsvQ50ySpOXx0ellSVGFbvIx+iQp6hRW\n33FjSVnQl/YcJmyYVwwaWYWR0Kegsu7n0LFXil4DpFjK6qJC1Iyrwq0Eg1cI+WRxGhnrcyi6EMbb\nXNWCKOUwsAuT+/kRgcW0GYsMV8Ou/aHo9RIDHG3LCkG9LrfsagF4hwOXcrq2HN2twcpmyiVl8rpI\nbeoce0qKusH/sPeURamHxGi8PCe9PoQjBSDSg4OFEwdrGtt6Wpm8+ogaX82z8beiqpOF8tjddpJq\neYcV5PVgx4He8zeHQ1TUwrncM6FfmbxOkoJx9Jd8FnW8muehfNRiNzVJkqacUZBXsaFimYwrBE2k\neQdrJhUUdcwBRscmTIx4JyAm82OIyM4K7KwPJgp5BGMRAWlF7gMcRZRf3YRhzFR+FuSjSq2VTaNp\nQkEq7wYcWxYUg0apFn1EUZmeVsRZeXkNkIC5lPo3CiGW94Mzx2N5ZbpOChjrnshnQf0kQMOVICno\n+bY6XHPntWn5qL8XcHC7+K1a+NLU6IfZFUmavbOZBKzURDQDKk/5z/dPU89ezJlF+Adz3zdrxlNl\nPwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAABrElEQVR4nG2STWsTQRzGfzs7TQPb\nKBb0ZEEa0IMUoRRMsI1vVDDoTdAKQo/ePXr05gfwExTFi3gQ2grR9tAYCSJSqC/FSxUUUSqJpbXJ\n7ONhd7tN1uc0wzPPy/xnIIFPRU4pOrpvI8YYfHeW3c+K9l6nUAyX2ad8oQeYZHNH64EFMOGta9vW\nTlCey8fSsExjKzKhKSepu5tG/tH1KJATPzXLEzWCA4UEB4ejOpZZfR/xN3QXP+2AhwUc5/n4pTrC\nCp6XksKCp+AcC0yy9gYneuEzLZV4pbkeV+LIe1odOLajmX7S4HX9Cu861cF2k35TDMUd3eSRFnvq\nxEouDm4tByVe42eUPg+1SEUqJYNNlcYdPk2Tq6yvZSKNx8lRzVPmZSvjaqDKRuP4Ker01QETMkXN\nlYZ+13AZUmNj1LnC26/ZW1omgs1abpzn2FS5d+yxVpiWm/rfYAvjLHGBTx+GjBIz2t1oOaNQbv+X\nDFt/Vw9Fza2etb2jZ1j6louEGriUe7/pJ/mW2/oxGs/OUNzWjTjfGh8uk38aT8Bzw/lWfa+ux5Ff\nCtPMruaTt/sHGSLJY4C28jEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAABv0lEQVR4nG2SsWtTURjFf/fe9ypF\nUkMdVBIMooNUWgTFBsSioAiCgiC4CCJx6ebiKgiCWyn+AYIiiDjo0k1th+KixUVxKQhFi41RQopN\nmnffPQ5JSmLeWe7w45z7fYfP0JGxKa508vSxvfnx3e3NRr1WbVe7zFryt5cb6lPQWgRgnN9zt7Jf\nJnxZXKn+yRXK544GP/Khwzj7VWlbHy+5blJ8oyY9BIzhQVCSaN5iIuecc1FERboFxvBYSep1H+tM\n1+k48jfMgOWR2sHrFbaHwJD73TqEo6JEQRsFLH3QrX8fhdIvBSW6R8SATp0A5pUoqHYQw5AO/FSQ\n14v+0F4v0eV9wSKWhowB7AxCUfg0nAl2CgvUfxAyYBEQ25uZzhwGaDVQBmx1Hpe1id1AwK6xzNg1\nhGG8NOg0zgH2HcL4kcn/SkhTgKmmJK+FwdoLT24C8FSJgpIybgdGzGkBY+BwTV6p3o/u0JjppmaJ\nwHFlW15ez2M6J+Iofla9iAEc17bkvdfiZHfii9+CXnZncEwsKyjR1uvZC9Pn77xNg9fV3ieW+Pqb\ndv9B+2cxhk6QJZjjZ8oTY/lc0qyur64srUrAPydi2eZYYGebAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACPUlEQVR4nE2Ty0tVYRTFf9/3Hctn\nXaEoiFBCyBz4wiDNF6RmaCViBI0K6Q+oQaNmDhtFsyCiiAaWVPggwSy7Xr0aJJpBamBEUERSl+z6\nuuesBuca7dlis/ZmL34bAAyZywr0rwJtlWHxwqaqCvi4ukOh2irKXVqwzgCAR4++FGK3xyzqOo7Q\naVK2mtlP1Vd8DzCp/ALOFme4DwBYitZ0lVva2l6a2lRKNwFwdMsvJq77RPLyciMz6ueykq3p5iNN\nUhKoC4flSFKXuK2FbAtYf18Fk7SbX1NgHO1Zv+O2lYlkaDyp4BTP9QxjjKFP4zSkdA4LiBa+vThY\nxgRORgcaiNHqvr8Nz2RWD+jSejkWR4dUzaiGsYDl6Kq6uae5HRg87mghs2Bd13AWLLU5K2PmOMOb\nTiaVXUlsvXknw4RhDmiCpkAdeDhqpIs81nQWxmLYX8MQdeZzFB+oJzG4u5TYmidwXJCqiesJFgxR\nDdMkteGwQCNzbw6VMoDBqugwI7TwdZwAa/xILTOpM1nJacBSu3ctShOjCSOwHJM66VUUYzDc1Tyl\nCXXjgbWc5mc0v54YVka5J3hF3a6VcQLA8FpPaZPqcMaj2Vc7fYphAKuScuJ0sDhPIGiyy/GcOgax\ngEdV3no/FcQTEd/4kXre/zi/h7F06L16R6P8EI+tQJKv+RwM4OVXMkjmQCLDCbNRWZwc2fSzXv5x\nPkCn1JamF4+HGoI0r+A1snGjx7pQ2UKmyEwhP9RL/7+BpIY02gB/AURoGsqj6bQMAAAAAElFTkSu\nQmCC\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAAB6klEQVR4nF2SzW+NQRSHnzPzuouL\nSuhtVVhoRKsuaUTEuhJLsZKIsGgsGhsbiZ0/wMJC7OovQEV8LERIrFhokJbe+miRtPFRbhP0631n\nfl3MfZtwdmeec848ZzKA57QUJClKUnNi5FIdPAB4zozOKsVk42shaXFkf0mB2nOFGL8fMWr1CxOK\n+nuqpFbhmvJcV9JB9bqWpUFcos5uKw864TPMZXBHKzHva3XiXqlQ0ZuKPb1/Yq4HrgXb51XoUxVL\ng7inPIaDLiW72hDvF5xatzyB6I671LnbCnhTKkiv8cZAK+0D4yVqQZoYdDiAyD7MqbG2Ns0co5Zg\npRvs10diCSNA1QGOrTuA6TlTCTdlwIIDjJ3roxgvfTA2GmIuwTqC8daWAF1EMZWK9xIdY6UsZv1E\nGHVAYA/mlibXfKIOYI5HgFGdUa63lXKso/ZDRXxXdWB0dwAfVrxKeKw9YLcWHDh6sgBjpYxFO4ts\ncTjZ9/8jm8XBwxE3PO0Bx33lMRxq/YuM7d9irs9bnAOjOqVC850YYOvY/EJ5CEfxgPf1EIMmnc+8\n99DzTMtR50hDuawiarYCwLbzP7WklSF8esaTVyuG7OHNubau/oFOoDH01AeAG1/0XzQubiBLS4ng\nDCCIuNycaTy++5vUxyp5g/ONPsol8QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAAB1UlEQVR4nGWSvU9UQRTFfzNveGyy\nrAYSTDQbC7awIMQEKdxFESlIiBbGaNDChMIYe/Uv0IrKir/AxkoKoxaurigrkYKCwvixiYkGjWJI\nYAm77Ju5FvM+lni6O/fjnHPvQIKACbGSoSPzxme0JrDn2G+Ij1WnUHJv6Op8JQvoJLgjX/IGQLsb\nV/aMGaP8KBe3ujIru34Iq2JFJNrPKJsy6wk5sSlzPJF6/lAhweEBL8cwJ7+K4Xe5R5BpQGEAy3k+\n/bhU5D09GsAKgGBASX6SF5xh+Z1q0Q0D2laO85opoqt9DjThy4aSNH9f1vVoqtPK6diuQUXBBGsu\numudBd28WVlZI2nUlFoyS6E3CILA6LAmDzHZ2m5J81j/hnN+qpOLiSMDTFLfmDlqF3cDAaG1hEun\nDjbkAQvyoRfFQRjF8JA84xRL7Vzk36KuS83LNzXclssHduenOs5SlXK4+TZlypIyMkKdC6z+Sc11\nrW8sv1XNnaSKselrWvZYlpmWTuV/SkxhlBpTfP3cpyW1vhMLvi5ObPeXdNvt9X5v2cjTHVUcp/Yz\n9I3SMx1+3AoSfsNt+T0UX0lT2pNrMb/RAcyQW4xXp+xAbrueylUc+Ssu44zkOcqX/gOdMexaxzgX\nUgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAAB9UlEQVR4nF2TS0iWQRiFn3dm/t9r\nKkU3ErXL5teVQRdaZSRtkrZCizZBFNSydhG0CFoWtG/voghDqDYlYWFCYaH+IdWi3IRE5u37Zk4L\nv0+ps5rhfc95z5yZAQhcVoGUbSBPyjUSALH8uqMXAAuUMD5aub53NfrkZm6uKDR2dPYPVkkniq4q\nw8qU6VbZe25dM80OACU7CHje+gbvvQ9u9CsTy8WMpD5MtvQuKgGmptX0amv8tGKuCcMAnG9fVB8b\nTJe6urDElHwESPx++XO2MOs5o6hcFwmA2d7TrZuaeK4rk9SPAzyPNOAqW8UR5Uk/tvtKCA0cWlnc\njdsMo/pJMdeTjW3rYz3DYMOQqbsHg6YLzZWWjp3Ha5rE55uqQ8q1hUxD+JIJRwGysZVKtbGttyWs\nfkClH8eo8qg6AOHYgt43YIADLLXWMDHnqsFbevM8za15FbKmnm65yGSKEQJ/XB0zFUwOuwRMFTf0\n5dsLpCK8wH1lScu14uC+HaOhjMDGlUd9bqR8F54rs6fwgLHrl1Kup5uJebdjQWcJgLdBJWW6gy+k\nKjzQfCsWwMUBYjCmfZFIzM5f0tiSjzhonldUruEyk7Zrq0kn8YRUqd3enxzG3T11rHFbZ9+RA2J6\n3CI8rK8p6V/kmW4QgHUp/vcVYtL3fTj4C7d+Eb8qksmCAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAABv0lEQVR4nG2STUhUURiGn3PuUWaU\nFFxIQSUtosRF2IxY4TQV2A9BC1cuKgLbumgduGjfukUQrVy2cJEEVmBN2I8OZT8QpA2RFLRxcDKb\nc+/b4t65muO7PN/3/nwvBzbRuqRQKbxuu/jdBNi//XtZrgUCML7toGYTkgHHuN62YwAIGNNyhwMw\n6rmVsT5H991Wxcv1AV5VAXCMqS5JfzYta7raEL2naa6r1t/SuStBZ1cLDjDKnuEReZ6XqSoNb3CA\nDQf38zg4zUuyHiCKAJRYTmiBnHwvlq1wYLwpsMAlfhXygTAmM1c2SrX3rWmEknycs67LBA2mDU+1\nV+eC+w+8B7t2dvTb09QPQ5FnK5nJDQG2nuP9dxslQ+M7jjHPnWs+7jlkJukQh9GhPh4yyJsP2Qjw\nmSnSYwNu6isDCk8mMbaeIgo8YYil14GN5cIG0dnowFFecJHSuq1vYxIwotWerhVdaVLFwgU+V4p7\nVuc3Y6TD0B1nmiE+fTRRMzN/mBLnmN1WeoxxVbK9vzXcbInlPO/Wh7OVxWZL7O4jTHGC8o+gyRJG\ntdHX9lM3dlDFFfGTrpuZHVThiyKFWmz85v/wD3x9wDSpU8bNAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAAByElEQVR4nF2RMWtUURCFv7n3rsua\nmCARrBLFQkPQhCBYi43+BisRbK1EURD8B/oPBCtT2GltSDRi0JAEJQElaqGGYLEounHfu3Ms3r5l\n3dvNnPmYM+cCJO5KLknyoiiKoihLqdSzADh7SzsGgKWUUkoxCmO56kHr3k0PsvaN7yON8aOTc2eh\nM19JITEnV6GF3ix3pKUQAHDZSYTxOjZjjLHBwj6LnnponkEYa5kMyIpuc5GKJDODFNofEQBqjnU2\nqUjzdIbgceebOYD4ufLqRw8MHNuXl3pIrIbrdlXMNt3EatU0QQgDIk7U+xBCjEmP3x121VcZT1Rm\n7baq8oo+tDAqQ6Y0i8HuVAgHRo+cv+YvO6mkXnzqTy95SVLWdSI1yXQrR/hbxNgwBOtQizCPQJff\nJIsjF2+Ptb/Q9xN4qtLVHq/KW9po9Enz1jTmcetXMBH9bf5aBO+FYByfwsSmW3ZXPhQ3qowSYJxu\n5GisY0Dm+aU1vF6ZeKBSrnO9ZP97Fl6odO1N1GFG62uByd9SqSWzISpAsgsHHdi2NCSmoC5XJeCz\nC9OQfuK+XMpanR0ddvNoq13n3f20vTLB4OKuVNZ/IW2PDrr6B++j6wniWe8eAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACJklEQVR4nE2STUhUYRiFn++732g6\nqRH2A1khNWQU6DgOUSZaRApaLWoRBG1cFy3ahBDUol3QNowWQdEq6HcMQ9D8S2NKiGqRmlFtzIWa\nac2997S4jnqW7895D+85sIqCCQVaga+bLqobD/svWcHkgicA4xcn1Le8ZMBxQWNxDAAe7ZosdQBG\nO6+vs36KzZ0FioZzaUbmAHC0KydJS6snF3Q+T3pXGdq1mIqVlSyjbGMMBxgVHeUldQxlNacV8QYH\n2ODADnpsIyMq8vMtBVo+eVVZaqQjWNbCgfFNA1na+DlafmYxYjSx6cdhxL39t06T0QMuyc+/5xUe\nDmzQFJ/v25JiiFYG7hfIo/xy0cM88x1lOKE/uzd800WKCwtpk1+FBQylH3SNTr3nnHxpUTe4rf4Y\nBofRnn1kSNNF7tFcWHWIDClGc84HPDr0lWROJ/FwXNGXeEJqxQOLaKCHevdjAGKKNfN+oYVfw4Tg\nbFhZyyBtvJsxgcJtaXpoonfGCKwhuWmuu3Q/L7AYGoqDrvXVDOJFtnZqlFP6m8bD0alhGrRUiwVs\n4A6S4TAfs0bWj6d4w3EmxggBS10VgzTTH9gQdiXpponuwEbvSXtTvYlKXpuSwJttYeZtVYIBbAjA\ncz2lI0qJAl9SqOmKKGduazVPmH02WwjGLzvG0JQX+/TdRE6f1VJNpBuPes3vXWO4ayS453tRISxn\n/LPDKljujitczWNOt9Ym5T8x3BEAnbHulgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAAB+klEQVR4nFWST0hUURjFf/fe9wIn\nKP+iNIxFK0UJWkQUilOh0KpN0iJatYyCNiG0aNMiaB2l7YMMgiCINhEokf0hwgiCEBLUUst0JKY3\n993T4r2ZxrO8P853zz3fNWRyQVHvsXJfW3ub2d7e2tj4UeoYyZBxxOMvKmqS11MiAEt67ka/zPrz\n2aXN1p4jx/uND26ejBUmFUL1dhcGgF3lV6rpbMYOvFcSKmNY55xzLrJ0LEgDgKX0RYmSMWKbpzMx\nD/WtAwwtM6p53SSmoYgpzQKOW0pSzRfy+wCIuaPHODhUVfC6lOXOZRm8dhgD9+WDvvc0Gxsqrip4\nTWN3HtvIQnS6S0bMYcMOGAIQDROs4yOql9w0PhrAYP4uN2DaZI9KGKhVGnCkM83MCilVKejnniys\npe+PQraWoLUoylcGgPg94Yrnu71RvH7vCRUpqFL6/0zHRXmlGsfZFQSF7jo0kWMIgl14BvYTwaR2\nsF6C0qRzFCM+bNvUvsQA5UZaQ7EoK2YwUFxRCNrorVsdF5Qq6AQOuzSJN2nrdZzNnUcJMqufCUDL\nnGpBuoxxkXORdW+VpnqDASz75+W91919GHCUJXlN4bJW2h8oBK+16StnRk5NLKvmE13Nl28Mw4+2\nmj90UDKKI58cTOnk0MHevbvjpLr5a/Hru9eLAP8ApdYEEPL0IlIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACY0lEQVR4nC2SS2iUZxiFn+/9/mSc\nRIfWhQWjUqFOjUSNNSFGTTKx1dEGe1mE7uLCjQs3rkTB0o1L9yLeNuJCaHHjeIlJc2/atKamGrFN\nrIIgKJKYe+b7/+NiPLvDgXM48ACAZ59iKehHPEaTEinonFFSE/N/Thi/AsYh5v566tVbihxDusIJ\n/bMK5xzduswxPcsYgGlTlgL7GJmJ5FRdTx9tDL8DIKJDrzd8NKV2PJ4jmq7KPNfRUqtxSX38oOlP\nMTw31Eeb5rZhgEvSrXTSSv//Ti5eXcsdmhh/6Aww6jdwm2Z+I+XLqftMAxykBytNntF4ea2KWQzP\nWU24z2eVx0fgAnsZXf6GN7kGLxe+Y1hfVb54iADHuhl1MKAgSVJRHVzXL3gisDi3cqnXrv4cQumY\n3arI0cWHlxfV6VKVkffe+7JUKsV+qQbDcCHTwIjOzy6EEEJYnlr8iTy//4eIcMrWUKCBkUfpxC1t\n3k2BXQwvRgHwnNZLq1fcjCfilP6t3Bj0LR4iRDPdyR4m//BmSfkhRufy/u0gCZglG3fQz2EGFlSM\n47V1dPElPa8dYI7ta2bvflzNfRyOlnR8e+UXDOAFeC7oAd9ragtGxBUN0aLFnRhgcdRIgb2MP3aJ\nC5k6hviayb8RYOyspp88vRiObA3d5LgXTAAc14uKzfPaj8dzUm/S2Wm1E5UgOMjY/IH08zGEyNG3\n0Jh5NUgMYJ/UcpPdPHjlE0vWb6WHNh69dAKw1qriYEUrvYBja9ViT9kuCiUIiFooXovW0ImAPO7y\niiqGPpDOhBLFGqvEAaOKFetJycB7QbMNsT/y4l8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAAB2UlEQVR4nE2RsU6UQRSFvzvzr2sg\nYhSRBBQVybJRg9ramJgYE2Nl77toYaGdL2BCZWVhZ4yFjQ2xUKFYBZcFIRiMQIxxA8zMsbj/Jk53\n8825c+YcINg7JUk61PaQ8UySpJL0PmClmTcioGrrZT+wt7ANYLH7CgBGnitlPTnp0+xeyeXv/SM+\nNXigA201iUAwujrQPBYCgOwshYX9mAFp9DjG21iVCkCaBhbNAEzjI0QtZeFKpjE6AsCYqLL97OHQ\nSvMMFcsUh20ya7tWQ8YmCb+7uJQriA4BX8vUUGZ911FmFuhgUAGhtMjxO80CWDk6Q+QLcggtCh9S\ncumxcSIr4FC0idw6bQJME40SdrbcHZh9UtZ/J2sx1ErT2CSW3vT9pq7OlNAtwZWB68rqMTgv1NdT\nKleG0iId6cbgT8Y5Al8ZGKJNYSVbAkI5dY6KZQQEKLQxOrU5Lg6XsN8bQNksgY6HZ7RJbG7X0DQ6\nRSP1BsnOITb6oYacHy38WndYuAwsY/6PwCUSq388nzLcwjx2qDC7htgx80VTk0RWzROIh7pDYF/B\nwMg3QgpsqjbQeKyc9NHrsZu9kpMeDTub/+Zhf359G+526gLWli4QQF5Ike7BQx0Wr+XHCYx/Ai3/\nupy+leAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAABvUlEQVR4nFXST0gTcBjG8fe3P2VJ\nVkbtsCQMwQKxgsrwIEZCiwgKDE9WRJccQpew6FQodNIET41Fp8xu0iKIdEGGhNAiq11KBXWIIkuX\nuj/u/Xap2PteHz487wuvSOm4m4v8n2yHz4T1zXtF07PiD+6S4lzUOE9XWvna7vE1LELminHSEIP8\n022yvw8Kn72uFHofrCoTl5y/ZVVZvmxh8yhkB8pcTRRyY6VOnL9vDd6fFf/FdSV13sJz4+jawy2u\nbgg2XtsTt0ay8KZJytpzyvRpC1sTaOaez514Bb9fWLj9eR6GT0p5uKAkT5l15GoSTd/yuqY4rDyx\nsCJWgGf1UnGnqHw6amHHFLp0w7nQR1jut3B3fBMita6yB/hw2MLbc2iqTaT1Cyz0WLhvogiPql2g\nH3h78B/0iYgQPuBhdmRaQiHc/MiUgcFvCt1BVxUFhqtsY28a/XFGJDyj/Oy0jdUzwN2AqxkCBgMW\nPs6g3xtFulKQvG7hoQWgs9LVxVCN7LFwcAMSx5x0L0GizcIjaeDaDjk+im727rTwZQ7Gap1/4BeM\nXzCRNK4D85OJyRXI3y+3MF74+/0K71os/AM4xgW1UDDFHQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAABe0lEQVR4nGWSMUtcQRSFvzvzZCVp\nkrUIbreSLklhhFVC0CJF/oKFfYpAqtT5AfkHSWObynRbhhVBYRsRE4iFYpUIyxa6iBDf3JNi3773\nfJ5imOHj3Htm5gJAYF2SJxXyXLrVx4ypHvwK851WcRDx38X1aJdKreVDJUlyTT49e1gjZkTeK5fk\nrk0iBAuzSsIQAG79b3MyXFlldp4U6b7gPt3VtAQgO93FaUCPKxgk+pdRDRjpLWEosofRgMZqKzdk\nFwNSE+ZsTB3HoyDuymiP5VKuD0QaTmOtjaHAQWkI1eYtCdyOfhcXqaDlcQVAHE6yZsvIixu55Noq\nW9bSvpxPhuxmUFat9f6uJCUN4uwJSqf54x6A8yNFNWDgTUeGMoZ3yhXaIBnifP9eS+PRmVxK2qn/\nUyjWV10ZiH4VZ2qzmLGjXHJpmdpsEAwC7+Quua6e1uYKIC683pZLkpK+dls19Pn45G+S+2zYr09/\nDp/PUo3lSrclS+76s1ik+g9g5c23gI6ztAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAAByklEQVR4nG2STUiUURSGn/uTU0xN\njZSrLMiCSIYRgsIZSRgba5Yui6iW7aNF2xYu3NSiRZsgWkuEhP1gONYwSjIVhGkpgZvMfqg0yY/5\nvntafB8Fczvb55x73vc9F7wynJNQpCkj1odChfWlbJeb8pkivSjDXJXFtPagpnCQKSrMbPgQevlQ\n7ezmET6MOM3L4GT7z4YPFV3djFHkzYL2oGEgszZjykyi/qPnjjzjhEgR0zqpXLZEjQrzb3EepKeT\nMY7z4ruV1lctI7KQ2r8p5zGtalWojjEdlFMbkzhfzuFALjAqj0FhQRkAnAMUhbZfDzN5atjQdzkq\nTxiQZh8arHa91za3SJC9e9tEKtqdp8oplmcRwHBTwmYzkotYDIMSFGjIrUSpmpUbXJHVPSg0w/Ke\n3JqcwQKanhzTlHj9BcExyFP6dnyq4wDN0dTX6q4jTGCVIXeICcrML+sYVphbLewL64goipmP9XSR\n8fgidmee5/Sz9G67FhWUmFsZ6qCWODsrTqJIkgrlMtfl1bZk0j1YV3uLVFfaBGim7tFP4/ffeCyX\n5POBxJimJ5Ih4kStNlBh6/3kT6igXf+I44nP2/FNnMi/teOouPUPaGfC8E848fIAAAAASUVORK5C\nYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAABaUlEQVR4nG2SzSuFURDGn5n3uHRL\nUZZKdj5KUkRCXXVZsMDOwk5RFv4dG1aysJIFSikbOx8rYuPKxscC+eyeM48Frvue3md1Or8zM8/M\nGeBPDvP0/JUZPTelAoUdg7nGyT4KQHneO3s5REqK1g8ajdftkAi5HLrLNHouIuecprHDEj2ND00Q\nAGlqGAIQsP2YEJEEjfc0GmeQxAwJpmg03jX82ImKFhAQsP+kjKGE3CgUgoM4BoCiN9CMby2/TWoK\nFtWL4ahUufjP6lGAgNiDy2ik+ZVmLHdllHSYY2DgcfI316o3hhEYDDshK2u+RDNyKHM8BdICL2sr\nv6VVkUV4Mex+ZQ3dnTLQOJ6RVdHjaYFnNf87oBDVn8NE4sWwVq7ymgigAoE7YfA8rkstj2vrFNUE\nY6Tnx3CqYv+R52oCxRY/+TWddnPP4LmexwIDzwcipxs0Gm/Oyavl+riLmtmd2/f3l4uViTw0Yt8x\nQrbw4D8MtwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Problem1: Display a sample of the images that we just download\n",
    "nums_image_show = 2#显示的图像张数\n",
    "for index_class in range(num_classes):\n",
    "    #i from 0 to 9\n",
    "    imagename_list = os.listdir(train_folders[index_class])\n",
    "    imagename_list_indice = imagename_list[0:nums_image_show]\n",
    "    for index_image in range(nums_image_show):\n",
    "        path = train_folders[index_class] +'/' + imagename_list_indice[index_image]\n",
    "        display(Image(filename = path))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 代码块4-加载和归一化图像数据\n",
    "\n",
    "该代码块主要实现了3个功能：1是将本地硬盘中的每类图像文件夹中的图像数据读到一个3维的dataset对象中，第1维是图像个数索引，其余2维则是图像数据。其中主要是利用了scipy模块中的ndarray对象兑取硬盘中的图像数据。2是将读取到的图像数据按照上文所述的公式进行了归一化。3是将ndarray对象打包为pickle格式并存储在工作目录下，每个类别有一个.pickle文件。并将打包后.pickle文件的地址存储为train_datasets和test_datasets返回。\n",
    "\n",
    "注：将数据打包为.pickle文件更便于数据的调用与处理。因为，图像的原始数据是使用循环打入到对象中的，如果每次使用图像数据均需要循环来加载，这样加大了代码量。而对.pickle文件只需要读取一次即可，而无需使用循环。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_large/A.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_large/B.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_large/C.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_large/D.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_large/E.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_large/F.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_large/G.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_large/H.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_large/I.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_large/J.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_small/A.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_small/B.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_small/C.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_small/D.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_small/E.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_small/F.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_small/G.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_small/H.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_small/I.pickle already present - Skipping pickling.\n",
      "/home/zlong/workspace/udacity/notMNIST/notMNIST_small/J.pickle already present - Skipping pickling.\n"
     ]
    }
   ],
   "source": [
    "image_size = 28  # Pixel width and height.\n",
    "pixel_depth = 255.0  # Number of levels per pixel.\n",
    "\n",
    "def load_letter(folder, min_num_images):\n",
    "  \"\"\"Load the data for a single letter label.\"\"\"\n",
    "  image_files = os.listdir(folder)\n",
    "  dataset = np.ndarray(shape=(len(image_files), image_size, image_size),\n",
    "                         dtype=np.float32)\n",
    "  print(folder)\n",
    "  num_images = 0\n",
    "  for image in image_files:\n",
    "    image_file = os.path.join(folder, image)\n",
    "    try:\n",
    "      image_data = (ndimage.imread(image_file).astype(float) - \n",
    "                    pixel_depth / 2) / pixel_depth\n",
    "      if image_data.shape != (image_size, image_size):\n",
    "        raise Exception('Unexpected image shape: %s' % str(image_data.shape))\n",
    "      dataset[num_images, :, :] = image_data\n",
    "      num_images = num_images + 1\n",
    "    except IOError as e:\n",
    "      print('Could not read:', image_file, ':', e, '- it\\'s ok, skipping.')\n",
    "    \n",
    "  dataset = dataset[0:num_images, :, :]\n",
    "  if num_images < min_num_images:\n",
    "    raise Exception('Many fewer images than expected: %d < %d' %\n",
    "                    (num_images, min_num_images))\n",
    "    \n",
    "  print('Full dataset tensor:', dataset.shape)\n",
    "  print('Mean:', np.mean(dataset))\n",
    "  print('Standard deviation:', np.std(dataset))\n",
    "  return dataset\n",
    "        \n",
    "def maybe_pickle(data_folders, min_num_images_per_class, force=False):\n",
    "  dataset_names = []\n",
    "  for folder in data_folders:\n",
    "    set_filename = folder + '.pickle'\n",
    "    dataset_names.append(set_filename)\n",
    "    if os.path.exists(set_filename) and not force:\n",
    "      # You may override by setting force=True.\n",
    "      print('%s already present - Skipping pickling.' % set_filename)\n",
    "    else:\n",
    "      print('Pickling %s.' % set_filename)\n",
    "      dataset = load_letter(folder, min_num_images_per_class)\n",
    "      try:\n",
    "        with open(set_filename, 'wb') as f:\n",
    "          pickle.dump(dataset, f, pickle.HIGHEST_PROTOCOL)\n",
    "      except Exception as e:\n",
    "        print('Unable to save data to', set_filename, ':', e)\n",
    "  \n",
    "  return dataset_names\n",
    "\n",
    "train_datasets = maybe_pickle(train_folders, 45000)\n",
    "test_datasets = maybe_pickle(test_folders, 1800)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题2 显示从pickle文件中读取的图像"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nWer/A3L2wD2f3RYAAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff6c5e1e278>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Problem2 Displaying a sample of the labels and images from the ndarray\n",
    "\n",
    "# Config the matplotlib backend as plotting inline in IPython\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "def load_and_displayImage_from_pickle(data_filename_set,NumClass,NumImage):\n",
    "    if(NumImage <= 0):\n",
    "        print('NumImage <= 0')\n",
    "        return\n",
    "    plt.figure('subplot')\n",
    "    for index,pickle_file in enumerate(data_filename_set):\n",
    "        with open(pickle_file,'rb') as f:\n",
    "            data = pickle.load(f)\n",
    "            ImageList = data[0:NumImage,:,:]\n",
    "            for i,Image in enumerate(ImageList):\n",
    "                #NumClass代表类别，每个类别一行;NumImage代表每个类显示的图像张数\n",
    "                plt.subplot(NumClass, NumImage, index*NumImage+i+1)\n",
    "                plt.imshow(Image)\n",
    "            index = index+1        \n",
    "#显示10类，每类显示5张图片        \n",
    "load_and_displayImage_from_pickle(train_datasets,10,5)    \n",
    "load_and_displayImage_from_pickle(test_datasets,10,5) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 问题3-检测数据是否平衡\n",
    "\n",
    "数据是否平衡的意思是各类样本的大小是否相当。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train_datasets:\n",
      "\n",
      "52909\n",
      "52911\n",
      "52912\n",
      "52911\n",
      "52912\n",
      "52912\n",
      "52912\n",
      "52912\n",
      "52912\n",
      "52911\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff6c5e3d208>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test_datasets:\n",
      "\n",
      "1872\n",
      "1873\n",
      "1873\n",
      "1873\n",
      "1873\n",
      "1872\n",
      "1872\n",
      "1872\n",
      "1872\n",
      "1872\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nmHOQvgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff6c1bc0b38>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def show_sum_of_different_class(data_filename_set):\n",
    "    plt.figure(1)\n",
    "    #read .pickle file\n",
    "    sumofdifferentclass = []\n",
    "    for pickle_file in data_filename_set:\n",
    "        with open(pickle_file,'rb') as f:\n",
    "            data = pickle.load(f)\n",
    "            print(len(data))\n",
    "            sumofdifferentclass.append(len(data))\n",
    "\n",
    "    #show the data\n",
    "    x = range(10)\n",
    "    plt.bar(x,sumofdifferentclass)    \n",
    "    plt.show()\n",
    "\n",
    "print('train_datasets:\\n')    \n",
    "show_sum_of_different_class(train_datasets)  \n",
    "print('test_datasets:\\n')    \n",
    "show_sum_of_different_class(test_datasets) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 代码块5-将不同类别的数据混合并将得到验证集\n",
    "\n",
    "该模块实现了2个功能：1是将不同类别的数据进行混合。之前是每个类别一个数据对象。现在，为了便于后续的训练，需将不同类别的数据存储为一个大的数据对象，即该对象同时包含A、B…J共个类别的样本。2是从训练集中提取一部分作为验证集。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training: (200000, 28, 28) (200000,)\n",
      "Validation: (10000, 28, 28) (10000,)\n",
      "Testing: (10000, 28, 28) (10000,)\n"
     ]
    }
   ],
   "source": [
    "def make_arrays(nb_rows, img_size):\n",
    "  if nb_rows:\n",
    "    dataset = np.ndarray((nb_rows, img_size, img_size), dtype=np.float32)\n",
    "    labels = np.ndarray(nb_rows, dtype=np.int32)\n",
    "  else:\n",
    "    dataset, labels = None, None\n",
    "  return dataset, labels\n",
    "\n",
    "def merge_datasets(pickle_files, train_size, valid_size=0):\n",
    "  num_classes = len(pickle_files)\n",
    "  valid_dataset, valid_labels = make_arrays(valid_size, image_size)\n",
    "  train_dataset, train_labels = make_arrays(train_size, image_size)\n",
    "  vsize_per_class = valid_size // num_classes\n",
    "  tsize_per_class = train_size // num_classes\n",
    "    \n",
    "  start_v, start_t = 0, 0\n",
    "  end_v, end_t = vsize_per_class, tsize_per_class\n",
    "  end_l = vsize_per_class+tsize_per_class\n",
    "  for label, pickle_file in enumerate(pickle_files):       \n",
    "    try:\n",
    "      with open(pickle_file, 'rb') as f:\n",
    "        letter_set = pickle.load(f)\n",
    "        # let's shuffle the letters to have random validation and training set\n",
    "        np.random.shuffle(letter_set)\n",
    "        if valid_dataset is not None:\n",
    "          valid_letter = letter_set[:vsize_per_class, :, :]\n",
    "          valid_dataset[start_v:end_v, :, :] = valid_letter\n",
    "          valid_labels[start_v:end_v] = label\n",
    "          start_v += vsize_per_class\n",
    "          end_v += vsize_per_class\n",
    "                    \n",
    "        train_letter = letter_set[vsize_per_class:end_l, :, :]\n",
    "        train_dataset[start_t:end_t, :, :] = train_letter\n",
    "        train_labels[start_t:end_t] = label\n",
    "        start_t += tsize_per_class\n",
    "        end_t += tsize_per_class\n",
    "    except Exception as e:\n",
    "      print('Unable to process data from', pickle_file, ':', e)\n",
    "      raise\n",
    "    \n",
    "  return valid_dataset, valid_labels, train_dataset, train_labels\n",
    "            \n",
    "            \n",
    "train_size = 200000\n",
    "valid_size = 10000\n",
    "test_size = 10000\n",
    "\n",
    "valid_dataset, valid_labels, train_dataset, train_labels = merge_datasets(\n",
    "  train_datasets, train_size, valid_size)\n",
    "_, _, test_dataset, test_labels = merge_datasets(test_datasets, test_size)\n",
    "\n",
    "print('Training:', train_dataset.shape, train_labels.shape)\n",
    "print('Validation:', valid_dataset.shape, valid_labels.shape)\n",
    "print('Testing:', test_dataset.shape, test_labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 代码块6-将混合后的数据进行随机化\n",
    "\n",
    "上一步只是将数据进行和混合并存储为一个大的数据对象，此步则将混合后的数据对象中的数据进行了随机化处理。只有随机化后的数据训练模型时才会有较为稳定的效果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def randomize(dataset, labels):\n",
    "  permutation = np.random.permutation(labels.shape[0])\n",
    "  shuffled_dataset = dataset[permutation,:,:]\n",
    "  shuffled_labels = labels[permutation]\n",
    "  return shuffled_dataset, shuffled_labels\n",
    "train_dataset, train_labels = randomize(train_dataset, train_labels)\n",
    "test_dataset, test_labels = randomize(test_dataset, test_labels)\n",
    "valid_dataset, valid_labels = randomize(valid_dataset, valid_labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题4 从验证混合后的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff6c1ab8f28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "'''Problem4 Convince yourself that the data is still good after shuffling!\n",
    "'''\n",
    "#data_set是数据集，NumImage是显示的图像张数\n",
    "def displayImage_from_dataset(data_set,NumImage):\n",
    "    if(NumImage <= 0):\n",
    "        print('NumImage <= 0')\n",
    "        return\n",
    "    plt.figure('subplot')\n",
    "    ImageList = data_set[0:NumImage,:,:]\n",
    "    for index,Image in enumerate(ImageList):\n",
    "        #NumClass代表类别，每个类别一行;NumImage代表每个类显示的图像张数\n",
    "        plt.subplot(NumImage//5+1, 5, index+1)\n",
    "        plt.imshow(Image)\n",
    "        index = index+1    \n",
    "    plt.show()\n",
    "displayImage_from_dataset(train_dataset,50)  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 代码块7-将不同的样本及存为.pickle文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".\n",
      "./notMNIST.pickle\n"
     ]
    }
   ],
   "source": [
    "data_root = '.' # Change me to store data elsewhere\n",
    "\n",
    "print(data_root)\n",
    "pickle_file = os.path.join(data_root, 'notMNIST.pickle')\n",
    "print(pickle_file)\n",
    "\n",
    "try:\n",
    "  f = open(pickle_file, 'wb')\n",
    "  save = {\n",
    "    'train_dataset': train_dataset,\n",
    "    'train_labels': train_labels,\n",
    "    'valid_dataset': valid_dataset,\n",
    "    'valid_labels': valid_labels,\n",
    "    'test_dataset': test_dataset,\n",
    "    'test_labels': test_labels,\n",
    "    }\n",
    "  pickle.dump(save, f, pickle.HIGHEST_PROTOCOL)\n",
    "  f.close()\n",
    "except Exception as e:\n",
    "  print('Unable to save data to', pickle_file, ':', e)\n",
    "  raise"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题5-数据清洗\n",
    "\n",
    "一般来说，训练集、验证集和测试集中会有数据的重合，但是，如果重合的数据太多则会影响到测试结果的准确程度。因此，需要对数据进行清洗，使彼此之间步存在交集。\n",
    "\n",
    "注：ndarray数据无法使用set的方式来求取交集。但如果使用循环对比的方式在数据量大的情况下会非常慢，因此，下文的做法使先将数据哈希化，再通过哈希的键值来判断数据是否相等。由于哈希的键值是字符串，因此比对起来效率会高很多。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of overlaps: 1284\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff6c21130f0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Overlapping images removed from test_dataset:  1284\n",
      "Overlapping images removed from valid_dataset:  1069\n",
      "Training: (200000, 28, 28) (200000,)\n",
      "Validation: (8931,) (8931,)\n",
      "Testing: (8716, 28, 28) (8716,)\n",
      "Compressed pickle size: 690800506\n"
     ]
    }
   ],
   "source": [
    "#先使用hash\n",
    "import hashlib\n",
    "\n",
    "#使用sha的作用是将二维数据和哈希值之间进行一一对应，这样，通过比较哈希值就能将二维数组是否相等比较出来\n",
    "def extract_overlap_hash_where(dataset_1,dataset_2):\n",
    "\n",
    "    dataset_hash_1 = np.array([hashlib.sha256(img).hexdigest() for img in dataset_1])\n",
    "    dataset_hash_2 = np.array([hashlib.sha256(img).hexdigest() for img in dataset_2])\n",
    "    overlap = {}\n",
    "    for i, hash1 in enumerate(dataset_hash_1):\n",
    "        duplicates = np.where(dataset_hash_2 == hash1)\n",
    "        if len(duplicates[0]):\n",
    "            overlap[i] = duplicates[0]\n",
    "    return overlap\n",
    "\n",
    "#display the overlap\n",
    "def display_overlap(overlap,source_dataset,target_dataset):\n",
    "    overlap = {k: v for k,v in overlap.items() if len(v) >= 3}\n",
    "    item = np.random.choice(list(overlap.keys()))\n",
    "    imgs = np.concatenate(([source_dataset[item]],target_dataset[overlap[item][0:7]]))\n",
    "    plt.suptitle(item)\n",
    "    for i,img in enumerate(imgs):\n",
    "        plt.subplot(2,4,i+1)\n",
    "        plt.axis('off')\n",
    "        plt.imshow(img)\n",
    "    plt.show()\n",
    "\n",
    "#数据清洗\n",
    "def sanitize(dataset_1,dataset_2,labels_1):\n",
    "    dataset_hash_1 = np.array([hashlib.sha256(img).hexdigest() for img in dataset_1])\n",
    "    dataset_hash_2 = np.array([hashlib.sha256(img).hexdigest() for img in dataset_2])\n",
    "    overlap = []\n",
    "    for i,hash1 in enumerate(dataset_hash_1):\n",
    "        duplictes = np.where(dataset_hash_2 == hash1)\n",
    "        if len(duplictes[0]):\n",
    "            overlap.append(i)\n",
    "    return np.delete(dataset_1,overlap,0),np.delete(labels_1, overlap, None)\n",
    "\n",
    "\n",
    "overlap_test_train = extract_overlap_hash_where(test_dataset,train_dataset)\n",
    "print('Number of overlaps:', len(overlap_test_train.keys()))\n",
    "display_overlap(overlap_test_train, test_dataset, train_dataset)\n",
    "\n",
    "test_dataset_sanit,test_labels_sanit = sanitize(test_dataset,train_dataset,test_labels)\n",
    "print('Overlapping images removed from test_dataset: ', len(test_dataset) - len(test_dataset_sanit))\n",
    "\n",
    "valid_dataset_sanit, valid_labels_sanit = sanitize(valid_dataset, train_dataset, valid_labels)\n",
    "print('Overlapping images removed from valid_dataset: ', len(valid_dataset) - len(valid_dataset_sanit))\n",
    "\n",
    "print('Training:', train_dataset.shape, train_labels.shape)\n",
    "print('Validation:', valid_labels_sanit.shape, valid_labels_sanit.shape)\n",
    "print('Testing:', test_dataset_sanit.shape, test_labels_sanit.shape)\n",
    "\n",
    "pickle_file_sanit = 'notMNIST_sanit.pickle'\n",
    "try:\n",
    "    f = open(pickle_file_sanit,'wb')\n",
    "    save = {\n",
    "        'train_dataset':train_dataset,\n",
    "        'train_labels': train_labels,\n",
    "        'valid_dataset': valid_dataset,\n",
    "        'valid_labels': valid_labels,\n",
    "        'test_dataset': test_dataset,\n",
    "        'test_labels': test_labels,\n",
    "    }\n",
    "    pickle.dump(save,f,pickle.HIGHEST_PROTOCOL)\n",
    "    f.close()\n",
    "except Exception as e:\n",
    "  print('Unable to save data to', pickle_file, ':', e)\n",
    "  raise\n",
    "\n",
    "statinfo = os.stat(pickle_file_sanit)\n",
    "print('Compressed pickle size:', statinfo.st_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题6-模型训练\n",
    "\n",
    "该模型是使用逻辑回归模型进行的训练。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.6392 when sample_size= 50\n",
      "Accuracy: 0.7437 when sample_size= 100\n",
      "Accuracy: 0.8353 when sample_size= 1000\n",
      "Accuracy: 0.8497 when sample_size= 5000\n"
     ]
    }
   ],
   "source": [
    "def train_and_predict(sample_size):\n",
    "    regr = LogisticRegression()\n",
    "    X_train = train_dataset[:sample_size].reshape(sample_size,784)\n",
    "    y_train = train_labels[:sample_size]\n",
    "    regr.fit(X_train,y_train)\n",
    "    X_test = test_dataset.reshape(test_dataset.shape[0],28*28)\n",
    "    y_test = test_labels\n",
    "\n",
    "    pred_labels = regr.predict(X_test)\n",
    "    print('Accuracy:', regr.score(X_test, y_test), 'when sample_size=', sample_size)\n",
    "\n",
    "for sample_size in [50,100,1000,5000,len(train_dataset)]:\n",
    "    train_and_predict(sample_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
